﻿using System.Collections.Generic;

namespace proba_pera
{
    public class RwpUnit:RwpBaseObject
    {
        private List<Waypoint> _way = new List<Waypoint>(); 
        private int _coordX, _coordY;
        private int _targetX, _targetY;
// ReSharper disable NotAccessedField.Local
        private double _angle;
// ReSharper restore NotAccessedField.Local

#pragma warning disable 169
        private int _speedX, _speedY;
#pragma warning restore 169
        private bool _moving;
        //последний ход
        private double _lastMoveX, _lastMoveY;
        //модель юнита (потом будет загружаться из класса карты)
        private int _model = 1;
        //идентификационный номер юнита
        private readonly int _id;
        //его хп
        private int _health;

        public RwpUnit(int x, int y, int id, int model)
        {
            _coordX = x;
            _coordY = y;
            _id = id;
            _model = model;
            Selected = false;
        }

        //выбран ли
        public bool Selected { get; set; }
        //атакован ли
        public bool Atacked { get; set; }

        public int GetModel()
        {
            return _model;
        }

        public int GetId()
        {
            return _id;
        }

        public int GetHealth()
        {
            return _health;
        }

        //нанести юниту повреждения
        public void Kick(int hp)
        {
            _health -= hp;
            if (_health < 0) _health = 0;
        }

        public bool IsMoving()
        {
            return _moving;
        }

        public double GetLastMoveX()
        {
            return _lastMoveX;
        }

        public double GetLastMoveY()
        {
            return _lastMoveY;
        }

        public double GetX()
        {
            return _coordX;
        }

        public double GetY()
        {
            return _coordY;
        }

        //шаги юнита вдоль оси
        public void StepX(int step)
        {
            _coordX += step;
            _lastMoveX = step;
        }

        public void StepY(int step)
        {
            _coordY += step;
            _lastMoveY = step;
        }

        public void Rotate(double dangle)
        {
            _angle += dangle;
        }

        //задать путь юнита
        public void SetWaypoints(List<Waypoint> list)
        {
            _way = new List<Waypoint>(list);
            if (_way.Count == 0) { _moving = false; return; }
            Waypoint next = _way[_way.Count - 1];
            GotoXy(next.X, next.Y);
            _way.Remove(next);
            _moving = true;
        }

        //отправить юнита в х, у
        private void GotoXy(int x, int y)
        {
            _targetX = x;
            _targetY = y;
        }

        //процедура движения
        private void MovingProcedure()
        {
            if (_coordX < _targetX)
                StepX(1);
            if (_coordX > _targetX)
                StepX(-1);
            if (_coordY < _targetY)
                StepY(1);
            if (_coordY > _targetY)
                StepY(-1);
            if (_coordX == _targetX && _coordY == _targetY)
            {
                if (_way.Count == 0) {_moving = false; return;}
                Waypoint next = _way[_way.Count - 1];
                GotoXy(next.X, next.Y);
                _way.Remove(next);
            }
        }

        //обновление статусов юнита
        public void Life()
        {
            if (_moving) MovingProcedure();
            
        }
    }
}